using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class WhisperSpeechToText : STT
{
    private void Awake()
    {
        // 初始化语音识别 API 地址
        m_SpeechRecognizeURL = GetPostUrl();
    }

    /// <summary>
    /// Whisper 服务器地址
    /// </summary>
    [SerializeField] private string m_ServerSetting = "http://localhost:9000";

    /// <summary>
    /// 任务类型（如：transcribe）
    /// </summary>
    [SerializeField] private string m_TaskType = "transcribe";

    /// <summary>
    /// 输出格式（如：json, txt 等）
    /// </summary>
    [SerializeField] private OutputType m_OutputType = OutputType.json;

    /// <summary>
    /// 构建最终 API 地址
    /// </summary>
    /// <returns>完整的识别请求地址</returns>
    private string GetPostUrl()
    {
        string _url = string.Format("{0}/asr?task={1}&encode=true&output={2}", m_ServerSetting, m_TaskType, m_OutputType);
        return _url;
    }

    /// <summary>
    /// 使用 AudioClip 进行语音识别
    /// </summary>
    /// <param name="_clip">音频剪辑</param>
    /// <param name="_callback">识别完成的回调</param>
    public override void SpeechToText(AudioClip _clip, Action<string> _callback)
    {
        // 将 AudioClip 转换为字节数组（WAV格式）
        byte[] _audioData = WavUtility.FromAudioClip(_clip);
        // 启动协程发送数据请求
        StartCoroutine(SendAudioData(_audioData, _callback));
    }

    /// <summary>
    /// 向 API 发送音频数据并接收响应
    /// </summary>
    /// <param name="audioBytes">音频数据</param>
    /// <param name="_callback">返回文本的回调</param>
    private IEnumerator SendAudioData(byte[] audioBytes, Action<string> _callback)
    {
        stopwatch.Restart(); // 开始计时

        // 构造表单并添加音频文件字段
        WWWForm form = new WWWForm();
        form.AddBinaryData("audio_file", audioBytes, "test.mp3", "audio/mpeg");

        // 构造 POST 请求
        UnityWebRequest www = UnityWebRequest.Post(m_SpeechRecognizeURL, form);
        www.SetRequestHeader("accept", "application/json");

        // 发送请求并等待响应
        yield return www.SendWebRequest();

        // 错误处理
        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.LogError("Error sending audio file: " + www.error);
        }
        else
        {
            // 获取返回的文本
            string _responseText = www.downloadHandler.text;
            // 根据设置的输出格式解析响应
            Response _response = ResponseSetting(_responseText);
            // 执行回调返回识别文本
            _callback(_response.text);
        }

        stopwatch.Stop();
        Debug.Log("Whisper语音识别耗时:" + stopwatch.Elapsed.TotalSeconds);
    }

    /// <summary>
    /// 根据输出格式解析返回的数据
    /// </summary>
    /// <param name="_msg">返回的原始文本</param>
    /// <returns>解析后的 Response 对象</returns>
    private Response ResponseSetting(string _msg)
    {
        Response _response = new Response();

        if (m_OutputType == OutputType.json) {
            // JSON 格式解析
            _response = JsonUtility.FromJson<Response>(_msg);
        }
        else if (m_OutputType == OutputType.txt)
        {
            // 文本格式直接返回
            _response.text = _msg;
        }
        else
        {
            // 其他格式直接以文本返回
            _response.text = _msg;
        }

        return _response;
    }

    #region 数据结构定义

    [Serializable]
    public class Response
    {
        /// <summary>
        /// 识别得到的纯文本内容
        /// </summary>
        [SerializeField] public string text = string.Empty;

        /// <summary>
        /// 分段数据（含起止时间）
        /// </summary>
        [SerializeField] public List<Segment> segments = new List<Segment>();

        /// <summary>
        /// 识别的语言（如 "zh"）
        /// </summary>
        [SerializeField] public string language = string.Empty;
    }

    [Serializable]
    public class Segment
    {
        [SerializeField] public int id; // 分段编号
        [SerializeField] public int seek; // 偏移值
        [SerializeField] public int start; // 起始时间（秒）
        [SerializeField] public int end; // 结束时间（秒）
        [SerializeField] public string text = string.Empty; // 文本内容
        [SerializeField] public int temperature; // 使用的温度参数
    }

    /// <summary>
    /// 支持的输出格式枚举
    /// </summary>
    public enum OutputType
    {
        txt, // 纯文本格式
        json, // JSON 格式
        vtt, // WebVTT 字幕格式
        srt, // SRT 字幕格式
        tsv  // TSV 表格格式
    }

    #endregion
}